using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._GeostatisticalAnalystTools._Utilities
{
    /// <summary>
    /// <para>Cross Validation</para>
    /// <para>Removes one data location and predicts the associated data using the data at the rest of the locations. The primary use for this tool is to compare the predicted value to the observed value in order to obtain useful information about some of your model parameters.</para>
    /// <para>删除一个数据位置，并使用其余位置的数据预测关联数据。此工具的主要用途是将预测值与观测值进行比较，以获取有关某些模型参数的有用信息。</para>
    /// </summary>    
    [DisplayName("Cross Validation")]
    public class CrossValidation : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public CrossValidation()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_geostat_layer">
        /// <para>Input geostatistical layer</para>
        /// <para>The geostatistical layer to be analyzed.</para>
        /// <para>要分析的地统计图层。</para>
        /// </param>
        public CrossValidation(object _in_geostat_layer)
        {
            this._in_geostat_layer = _in_geostat_layer;
        }
        public override string ToolboxName => "Geostatistical Analyst Tools";

        public override string ToolName => "Cross Validation";

        public override string CallName => "ga.CrossValidation";

        public override List<string> AcceptEnvironments => ["geographicTransformations", "outputCoordinateSystem", "parallelProcessingFactor", "workspace"];

        public override object[] ParameterInfo => [_in_geostat_layer, _out_point_feature_class, _count, _mean_error, _root_mean_square, _average_standard, _mean_standardized, _root_mean_square_standardized, _percent_in_90_interval, _percent_in_95_interval, _average_crps];

        /// <summary>
        /// <para>Input geostatistical layer</para>
        /// <para>The geostatistical layer to be analyzed.</para>
        /// <para>要分析的地统计图层。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input geostatistical layer")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_geostat_layer { get; set; }


        /// <summary>
        /// <para>Output point feature class</para>
        /// <para>Stores the cross-validation statistics at each location in the geostatistical layer.</para>
        /// <para>存储地统计图层中每个位置的交叉验证统计数据。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output point feature class")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _out_point_feature_class { get; set; } = null;


        /// <summary>
        /// <para>Count</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Count")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public long _count { get; set; }


        /// <summary>
        /// <para>Mean error</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Mean error")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public double _mean_error { get; set; }


        /// <summary>
        /// <para>Root mean square</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Root mean square")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public double _root_mean_square { get; set; }


        /// <summary>
        /// <para>Average standard</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Average standard")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public double _average_standard { get; set; }


        /// <summary>
        /// <para>Mean standardized</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Mean standardized")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public double _mean_standardized { get; set; }


        /// <summary>
        /// <para>Root mean square standardized</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Root mean square standardized")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public double _root_mean_square_standardized { get; set; }


        /// <summary>
        /// <para>Percent in 90% Interval</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Percent in 90% Interval")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public double _percent_in_90_interval { get; set; }


        /// <summary>
        /// <para>Percent in 95% Interval</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Percent in 95% Interval")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public double _percent_in_95_interval { get; set; }


        /// <summary>
        /// <para>Average CRPS</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Average CRPS")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public double _average_crps { get; set; }


        public CrossValidation SetEnv(object geographicTransformations = null, object outputCoordinateSystem = null, object parallelProcessingFactor = null, object workspace = null)
        {
            base.SetEnv(geographicTransformations: geographicTransformations, outputCoordinateSystem: outputCoordinateSystem, parallelProcessingFactor: parallelProcessingFactor, workspace: workspace);
            return this;
        }

    }

}